import numpy as np
import csv
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sns.set(color_codes = True)
from data import *
from scipy import stats
DATA = Data('../data/movie_metadata.csv')
Ce notebook a pour objectif d'illustrer la partie du cours sur la régression linéaire. Les commentaires associés à chaque figure sont ceux que l'on a pu faire en séance.
score = DATA.get_imdb_score()
budget = DATA.get_budget()
year = DATA.get_title_year()
voted_user = DATA.get_num_voted_users()
plt.plot(voted_user[:29], score[:29], 'o')
plt.xlabel('Nombre d''utilisateurs qui ont voté')
plt.ylabel('Score')
plt.show()
from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score
regr = linear_model.LinearRegression()
regr.fit(voted_user[:29].reshape(-1, 1), score[:29].reshape(-1, 1))
La régression réalisée avec la fonction 'linear_model.LinearRegression.fit()' utilise la fonction de coût quadratique.
X = np.arange(voted_user[:29].min(), voted_user[:29].max())[:, np.newaxis]
Y = regr.predict(X)
plt.plot(voted_user[:29], score[:29], 'o')
plt.plot(X, Y, 'navy')
plt.xlabel('Nombre d''utilisateurs qui ont voté')
plt.ylabel('Score')
plt.show()
a = regr.coef_[0]
b = np.mean(Y) - a*np.mean(X)
print('Equation de la droite : y = '+str(a[0])+' x + ' + str(b[0]))
quadr_cost = np.sum( ( a*voted_user[:29] + b - score[:29])**2 )
print('Coût absolu : ' + str(quadr_cost))
Vérifions que la droite trouvée permet de minimiser les différents coûts en faisant varier légèrement les valeurs des paramètres a et b.
b_tilde = [0.8, 0.9, 1., 1.1, 1.2]*b
a_tilde = [0.8, 0.9, 1., 1.1, 1.2]*a
for i in range(len(a_tilde)):
for j in range(len(b_tilde)):
y = a_tilde[i]*voted_user[:29] + b_tilde[j]
print('Coût quadratique : ' + str( np.sum( ( y - score[:29])**2 )) + ' pour a_tilde = ' + str(a_tilde[i])+ ' et b_tilde = ' + str(b_tilde[j]))
print('\n')
for i in range(len(a_tilde)):
for j in range(len(b_tilde)):
y = a_tilde[i]*voted_user[:29] + b_tilde[j]
print('Coût absolu : ' + str( np.sum( np.abs( y - score[:29]) )) + ' pour a_tilde = ' + str(a_tilde[i])+ ' et b_tilde = ' + str(b_tilde[j]))
X = np.arange(3, 15, 0.2)
Y = np.sin(2*np.pi*X*0.3) + np.random.normal(0, 0.2, len(X))
plt.plot(X,Y, 'o')
plt.plot(X, np.sin(2*np.pi*X*0.3))
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
X = np.arange(0, 15, 0.5)
Y = (X)**3 + np.random.normal(0, 200, len(X))
plt.plot(X,Y, 'o')
plt.plot(X, (X)**3)
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
X = np.arange(3, 15, 0.5)
Y = 0.78*X + 0.90 + np.random.normal(0, 1.5, len(X))
plt.plot(X,Y, 'o')
plt.plot(X, 0.78*X + 0.90)
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
regr2 = linear_model.LinearRegression()
regr2.fit(X.reshape(-1, 1), Y.reshape(-1, 1))
a = regr2.coef_[0]
b = np.mean(Y) - a*np.mean(X)
print('Equation de la droite : y = '+str(a[0])+' x + ' + str(b[0]))
print(np.sum(X*(Y - np.mean(Y)))/np.sum(X*(X - np.mean(X))))
X_axis = np.arange(X.min(), X.max())[:, np.newaxis]
Y_pred = regr2.predict(X_axis)
plt.plot(X,Y, 'o')
plt.plot(X, 0.78*X + 0.90)
plt.plot(X_axis, Y_pred, 'navy')
plt.plot(X, a*X + b, 'red')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
Remarques : on peut faire varier le nombre de points ou la variance du bruit pour constater l'influence sur la qualité d'estimation de la régression linéaire